package com.good.msgsys.utils;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;

import java.util.Date;
import java.util.Map;

/**
 * Jwt生成、解析token的工具类
 *
 * @author junlong
 * @date 2021/1/5 15:12
 */
@Data
@ConfigurationProperties("jwt.config")
public class JwtUtil {
    private String key; // 签名私钥
    private Long ttl; //签名的失效时间

    // 通过jjwt创建token

    /**
     * 创建token
     *
     * @param id 登录用户id
     * @param name 登录用户名
     * @param map 自定义claim中的内容
     * @return 返回token
     */
    public String createJwt(String id, String name, Map<String, Object> map) {
        // 1.设置失效时间
        long now = System.currentTimeMillis();
        long exp = now + ttl;

        // 2.创建jwtBuilder对象
        JwtBuilder jwtBuilder = Jwts.builder()
                .setId(id)
                .setSubject(name)
                .setIssuedAt(new Date())
                .signWith(SignatureAlgorithm.HS256, key);

        // 3.根据map设置claims
        if (map != null) {
            for (Map.Entry<String, Object> entry : map.entrySet()) {
                jwtBuilder.claim(entry.getKey(), entry.getValue());
            }
        }
        jwtBuilder.setExpiration(new Date(exp));

        // 4.生成token
        return jwtBuilder.compact();
    }

    /**
     * 解析token
     */
    public Claims parseJwt(String token) {
        return Jwts.parser().setSigningKey(key).parseClaimsJws(token).getBody();
    }
}
